package rpc

import (
	"devops/src/models"
	"encoding/json"
	"fmt"
	"log"
)

func (*Server) HostInfoReport(input models.AgentCollectInfo, output *string) error {
	log.Printf("[HostInfoReport] input: %+v", input)
	// *output = "i know"
	ips := []string{input.IpAddr}
	ipJ, _ := json.Marshal(ips)
	if input.SN == "" {
		input.SN = input.HostName
	}
	if input.SN == "" {
		*output = "sn is empty"
		return nil
	}
	//获取对象的uid
	rh := models.ResourceHost{
		Uid:        input.SN,
		Name:       input.HostName,
		PrivateIps: ipJ,
		CPU:        input.CPU,
		Mem:        input.Mem,
		Disk:       input.Disk,
	}
	hash := rh.GenHash()
	//uid肯定是不会变的
	//用uid 获取之前的结果，在根据两者是否一致决定更改。
	rhUid := models.ResourceHost{Uid: input.SN}
	//因为现在需要一个getone的函数所以给结构体补充了一个getone 的方法
	rhUidDb, err := rhUid.GetOne()
	if err != nil {
		*output = "get db error"
		return err
	}
	if rhUidDb == nil {
		//说明指定uid 不存在，那么就插入,所以需要造一个插入方法
		rh.Hash = hash
		err = rh.AddOne()
		if err != nil {
			*output = fmt.Sprintf("add db error %v", err)

		} else {
			*output = "insert success"

		}
		return nil
	}
	if rhUidDb.Hash != hash {
		rh.Hash = hash
		//期望下一步该进行更新了，那么此结构体有更新函数吗，没有那么就需要新造一个更新函数
		updated, err := rh.Update()
		if err != nil {

			*output = fmt.Sprintf("update db error %v", err)
			return nil
		}
		if updated {

			*output = "update success"
			return nil
		}

	}
	log.Printf("[host.info.same][HostInfoReport][input:%+v]", input)
	//uid 存在并且hash 相等那么就什么都不需要做。
	return nil
}
